home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / godelqc5.zip / TEAMPLAY.QC < prev    next >
Text File  |  1996-09-20  |  15KB  |  593 lines

  1. float checktime;
  2.  
  3. //prototypes
  4. void() ActivateFlag;
  5.  
  6. void (entity temp_ent) GiveQuakePower = {
  7.     temp_ent.items = temp_ent.items | IT_QUAD;
  8.     temp_ent.super_time = 1;
  9.     temp_ent.super_damage_finished = time + 1000;
  10. };
  11.  
  12. void (entity temp_ent) RemoveQuakePower = {
  13.     temp_ent.items = temp_ent.items - (temp_ent.items & IT_QUAD);
  14.     temp_ent.super_damage_finished = 0;
  15.     temp_ent.super_time = 0;
  16. };
  17.  
  18. void (entity ent) MakeIt = {
  19.     local string s;
  20.     if (teamplay == 6) GiveQuakePower(ent);
  21.     if(teamplay==4) {
  22.         if (!(ent.flags & FL_AM_IT)) centerprint(ent,"You're IT!\n");
  23.         ent.items=ent.items | IT_KEY1;
  24.         ent.items=ent.items - (ent.items & IT_KEY2);
  25.         ent.effects=ent.effects | EF_DIMLIGHT;
  26.         stuffcmd(ent,"COLOR 4 ");
  27.         s=ftos(ent.team - 1);
  28.         stuffcmd(ent,s);
  29.         stuffcmd(ent,"\n");
  30.     } else if((teamplay==5)||(teamplay==6)) {
  31.         if (!(ent.flags & FL_AM_IT)) centerprint(ent,"You're TI!\n");
  32.         ent.items=ent.items | IT_KEY2;
  33.         ent.items=ent.items - (ent.items & IT_KEY1);
  34.         ent.effects=ent.effects | EF_DIMLIGHT;
  35.         stuffcmd(ent,"COLOR 4 ");
  36.         s=ftos(ent.team - 1);
  37.         stuffcmd(ent,s);
  38.         stuffcmd(ent,"\n");
  39.     }
  40.     ent.flags=ent.flags | FL_AM_IT;
  41. };
  42.  
  43. void (entity ent) MakeNotIt = {
  44.     local string s;
  45.     if (teamplay == 6) RemoveQuakePower(ent);
  46.     if(teamplay==4) {
  47.         if (!(ent.flags & FL_AM_IT)) centerprint(ent,"You're not IT anymore!\n");
  48.         ent.items=ent.items - (ent.items & IT_KEY1);
  49.         ent.items=ent.items - (ent.items & IT_KEY2);
  50.         stuffcmd(ent,"COLOR 2 ");
  51.         s=ftos(ent.team - 1);
  52.         stuffcmd(ent,s);
  53.         stuffcmd(ent,"\n");
  54.     } else if((teamplay==5)||(teamplay==6)) {
  55.         if (!(ent.flags & FL_AM_IT)) centerprint(ent,"You're not TI anymore!\n");
  56.         ent.items=ent.items - (ent.items & IT_KEY1);
  57.         ent.items=ent.items - (ent.items & IT_KEY2);
  58.         stuffcmd(ent,"COLOR 2 ");
  59.         s=ftos(ent.team - 1);
  60.         stuffcmd(ent,s);
  61.         stuffcmd(ent,"\n");
  62.     }
  63.     ent.flags=ent.flags-(ent.flags & FL_AM_IT);
  64.     ent.effects=ent.effects-(ent.effects * EF_DIMLIGHT);
  65. };
  66.  
  67. void() RemoveFlagsAndBases = {
  68.     local entity head;
  69.     head=find(world,classname,"base");
  70.     while(head){
  71.         remove(head);
  72.         head=find(world,classname,"base");
  73.     }
  74.     head=find(world,classname,"flag");
  75.     while(head){
  76.         remove(head);
  77.         head=find(world,classname,"flag");
  78.     }
  79.     world_flag=3;
  80. };
  81.  
  82. void() RemoveHill = {
  83.     local entity head;
  84.     head=find(world,classname,"hill");
  85.     while(head){
  86.         remove(head);
  87.         head=find(world,classname,"hill");
  88.     }
  89.     world_hill=0;
  90. };
  91.  
  92. void() CheckTeamPlayChange = {
  93.     local entity head;
  94.     if(teamplay!=oldteamplay){
  95.         if (oldteamplay==6){
  96.             head=find(world,classname,"player");        
  97.             while(head){
  98.                 RemoveQuakePower(head);    
  99.                 head=find(head,classname,"player");        
  100.             }
  101.         }
  102.         if (oldteamplay==7){
  103.             head=find(world,classname,"player");        
  104.             while(head){
  105.                 head.items=head.items-(head.items & IT_KEY1); 
  106.                 head.items=head.items-(head.items & IT_KEY2); 
  107.                 head.flaginv=0;
  108.                 head=find(head,classname,"player");        
  109.             }
  110.         }
  111.         if(teamplay==0) bprint("No Teams Mode\n");
  112.         else if(teamplay==1) bprint("Normal Team Mode\n");
  113.         else if(teamplay==2) bprint("Damage Team Mode\n");
  114.         else if(teamplay==4) bprint("IT Mode\n");
  115.         else if(teamplay==5) bprint("TI Mode\n");
  116.         else if(teamplay==6) bprint("Quake-TI Mode\n");
  117.         else if(teamplay==7) bprint("Capture the Flag Mode\n");
  118.         else if(teamplay==8) bprint("King of the Hill Mode\n");
  119.         oldteamplay=teamplay;
  120.         self.impulse=17; // remove flags/bases/hills
  121.     }
  122. };
  123.  
  124. void() HillThink = {
  125.     local entity head;
  126.     head=findradius(self.origin,200);
  127.     while(head){
  128.         if((head.classname=="player") && (head.health > 0) && (!(head.flags & FL_OBSERVER))) {
  129.             sound(head,CHAN_BODY,"misc/talk.wav",0.1,ATTN_NORM);
  130.             head.frags=head.frags+0.1;
  131.         }
  132.         head=head.chain;
  133.     }
  134.     self.nextthink=time+1;
  135.     if (!world_hill) remove(self);
  136. };
  137.  
  138. void() PlaceHill = {
  139.     local entity hill;  
  140.     if(!world_hill){
  141.         bprint(self.netname);
  142.         bprint(" placed the Hill\n");
  143.         world_hill=1;
  144.         hill=spawn();
  145.         setmodel(hill,"progs/end4.mdl");
  146.         hill.classname="hill";
  147.         setorigin(hill,self.origin);
  148.         hill.movetype = MOVETYPE_TOSS;
  149.         hill.solid = SOLID_NOT;
  150.         hill.think = HillThink;
  151.         hill.nextthink = time + 0.1;
  152.         setsize (hill, VEC_ORIGIN, VEC_ORIGIN);           
  153.         hill.effects = hill.effects | EF_DIMLIGHT;
  154.     }
  155. };
  156.  
  157. void() CheckBase = {
  158.     local entity newflag;
  159.     local entity oldbase,entity;
  160.     local float flag_color;
  161.  
  162.     self.think = CheckBase;
  163.     self.nextthink = time + 1;
  164.     if (world_flag & self.items) remove(self);
  165.     else if (self.watertype < -3) {
  166.         flag_color = self.items;
  167.         if (flag_color == FLAG_1)
  168.             bprint ("Silver ");
  169.         if (flag_color == FLAG_2)
  170.             bprint ("Gold ");
  171.         bprint("Base unreachable. Removing."); 
  172.         world_flag=world_flag+self.items;
  173.         remove(self);
  174.     }
  175. };
  176.  
  177. void() CheckFlag = {
  178.     local entity newflag;
  179.     local entity oldbase,entity;
  180.     local float flag_color;
  181.  
  182.     self.think = CheckFlag;
  183.     self.nextthink = time + 1;
  184.     if (world_flag & self.items) {
  185.         remove(self);
  186.     }
  187.     else if (self.watertype < -3) {
  188.         flag_color = self.items;
  189.         if (flag_color == FLAG_1)
  190.             bprint ("Silver ");
  191.         if (flag_color == FLAG_2)
  192.             bprint ("Gold ");
  193.         bprint("flag unreachable. Respawning."); 
  194.         remove(self);
  195.         
  196.         oldbase = world;
  197.         while (oldbase.items != flag_color)
  198.         oldbase = find(oldbase,classname,"base");
  199.                 
  200.         newflag = spawn();
  201.         newflag.owner = oldbase;
  202.         newflag.movetype = MOVETYPE_NONE;
  203.         newflag.solid = SOLID_NOT;
  204.         newflag.items = flag_color;
  205.         newflag.classname = "flag";
  206.         newflag.think = ActivateFlag;
  207.         newflag.nextthink = time + 0.5;
  208.         setsize (newflag, VEC_ORIGIN, VEC_ORIGIN);           
  209.         setorigin (newflag, oldbase.origin);
  210.         newflag.pos1 = newflag.origin;
  211.         newflag.velocity = VEC_ORIGIN;
  212.         if (flag_color == FLAG_1) setmodel(newflag,"progs/m_s_key.mdl");
  213.         else setmodel(newflag,"progs/m_g_key.mdl");
  214.     }
  215. };
  216.  
  217. void(entity who,float flag_color) ReturnFlagToBase = {
  218.     local entity newflag;
  219.     local float team_color,flag_color;
  220.     local entity head;
  221.     team_color=who.team;
  222.     sound (who, CHAN_WEAPON, "misc/secret.wav", 1, ATTN_NORM);    
  223.     newflag = spawn();
  224.     newflag.owner = self;
  225.     newflag.movetype = MOVETYPE_NONE;
  226.     newflag.solid = SOLID_NOT;
  227.     newflag.items = flag_color;
  228.     newflag.classname = "flag";
  229.     newflag.think = ActivateFlag;
  230.     newflag.nextthink = time + 0.1;
  231.     setsize (newflag, VEC_ORIGIN, VEC_ORIGIN);           
  232.     head = world;
  233.     while(head.items != flag_color)
  234.         head = find(head,classname,"base");
  235.     setorigin (newflag, head.origin);
  236.     newflag.pos1 = newflag.origin;
  237.     newflag.velocity = VEC_ORIGIN;
  238.     if (flag_color == FLAG_1)
  239.         setmodel(newflag,"progs/m_s_key.mdl");
  240.     else
  241.         setmodel(newflag,"progs/m_g_key.mdl");
  242.     who.flaginv=who.flaginv-flag_color;
  243.     if (who.team==flag_color) who.flagtime=0;
  244. };
  245.  
  246. void() PickupFlag = {
  247.     local float team_color;
  248.     local float flag_color;
  249.     local entity newflag;
  250.     local entity oldbase;
  251.  
  252.     if (world_flag) return;
  253.     if (other == world) return;
  254.     if (other.classname != "player") return;
  255.     flag_color = self.items;
  256.     team_color = other.team;
  257.     if (team_color > 2)
  258.     {
  259.         centerprint(other,"You must be on Silver or Gold team\n");
  260.         centerprint(self,"Type COLOR x 0 or COLOR x 1\n");
  261.         return;
  262.     }
  263.     if ((flag_color == team_color) && (self.origin_x == self.pos1_x) && (self.origin_y == self.pos1_y))
  264.     {
  265.         // You cannot take your flag from your base
  266.         return;
  267.     }
  268.     bprint(other.netname);
  269.     bprint(" picked up the ");
  270.     if (flag_color == FLAG_1) bprint("silver flag.\n");
  271.     if (flag_color == FLAG_2) bprint("gold flag.\n");
  272.     sound (self, CHAN_WEAPON, "misc/secret.wav", 1, ATTN_NORM);    
  273.     if (flag_color == team_color) {        
  274.         other.flagtime = time + 30;
  275.     }
  276.     other.flaginv = other.flaginv + flag_color;
  277.     remove(self);
  278. };
  279.  
  280. void() ActivateFlag =
  281. {
  282.     local entity newflag;    
  283.     local entity oldbase;
  284.     local float flag_color;
  285.     
  286.     self.owner = self;
  287.     self.movetype = MOVETYPE_TOSS;
  288.     self.solid = SOLID_TRIGGER;
  289.     self.touch = PickupFlag;
  290.     self.think = CheckFlag;
  291.     self.effects = self.effects | EF_DIMLIGHT;
  292.     self.nextthink = time + 5;
  293.     if (world_flag) {
  294.         self.pos1 = self.origin;        
  295.     }
  296. };
  297.  
  298. void() TouchBase = {
  299.     local float team_color;
  300.     local float base_color;
  301.     local entity oldbase,head;
  302.     local entity newflag;    
  303.  
  304.     if (other == world) return;
  305.     if (other.classname != "player") return;
  306.     if(other.flaginv==0) return;
  307.     base_color = self.items;
  308.     team_color = other.team;
  309.     if (team_color > 2) {
  310.         centerprint(other,"You must be on Silver or Gold team\n");
  311.         centerprint(self,"Type COLOR x 0 or COLOR x 1\n");
  312.         return;
  313.         }
  314.     if (team_color == base_color) {
  315.         if (other.flaginv & base_color) {
  316.                 bprint(other.netname);
  317.                 bprint(" returns the flag to his base\n");
  318.                 ReturnFlagToBase(other,base_color);
  319.             }       
  320.         if (other.flaginv & (FLAG_BOTH - team_color)) {        
  321. //    Give the team scores
  322.             bprint(other.netname);
  323.             bprint(" secures ");
  324.             if (team_color == FLAG_1)
  325.                 bprint("Gold flag.\n");
  326.             if (team_color == FLAG_2)
  327.                 bprint("Silver flag.\n");
  328.           other.frags = other.frags + 5;
  329.             head = find(world,classname,"player");
  330.             while(head){
  331.                 if (head.team==team_color)
  332.                     head.frags=head.frags+5;
  333.                 head = find(head,classname,"player");
  334.             }
  335.             ReturnFlagToBase(other,(FLAG_BOTH - team_color));
  336.         }
  337.     }
  338. };
  339.  
  340. void() ActivateBase =
  341. {
  342.     local entity found;
  343.  
  344.     self.owner = self;
  345.     self.movetype = MOVETYPE_TOSS;
  346.     self.solid = SOLID_TRIGGER;
  347.     self.touch = TouchBase;
  348.     self.think = CheckBase;
  349.     self.nextthink = time+1;
  350.     if (world_flag == 0)
  351.     {
  352.         bprint("Flags placed. Let the Games begin!\n");
  353.         return;
  354.     }
  355. };
  356.  
  357. void (float flag_color) PlaceBase =    
  358. {
  359.     local entity newbase;
  360.  
  361.     newbase = spawn();
  362.     newbase.owner = self;
  363.     newbase.movetype = MOVETYPE_NONE;
  364.     newbase.solid = SOLID_NOT;
  365.     newbase.items = flag_color;
  366.     newbase.classname = "base";
  367.     newbase.think = ActivateBase;
  368.     newbase.nextthink = time + 1;
  369.     setsize (newbase, VEC_ORIGIN, VEC_ORIGIN);           
  370.     setorigin (newbase, self.origin + '0 0 3');
  371.     newbase.velocity = VEC_ORIGIN;
  372.     if (flag_color == 1) setmodel(newbase,"progs/w_s_key.mdl");
  373.     else setmodel(newbase,"progs/w_g_key.mdl");
  374.     world_flag = world_flag - flag_color;
  375. };
  376.  
  377. void(float flag_color) DropFlag = {
  378.     local entity newflag;
  379.     newflag = spawn();
  380.     newflag.owner = self;
  381.     newflag.movetype = MOVETYPE_NONE;
  382.     newflag.solid = SOLID_NOT;
  383.     newflag.items = flag_color;
  384.     newflag.classname = "flag";
  385.     newflag.think = ActivateFlag;
  386.     newflag.nextthink = time + 1;
  387.     setsize (newflag, VEC_ORIGIN, VEC_ORIGIN);           
  388.     setorigin (newflag, self.origin);
  389.     newflag.velocity_x = 250*random();
  390.     newflag.velocity_y = 250*random();
  391.     if (flag_color == FLAG_1) setmodel(newflag,"progs/m_s_key.mdl");
  392.     else setmodel(newflag,"progs/m_g_key.mdl");
  393.     self.attack_finished = time + 1;
  394.     self.flaginv=self.flaginv-flag_color;
  395. };
  396.  
  397. void(float both) DropFlagCheck = {
  398.     local float flag_color;
  399.     local entity newflag;
  400.     if (teamplay != 7) {
  401.         return;
  402.     }
  403.     flag_color=self.flaginv;
  404.     if (flag_color == 3) {
  405.         // you have both flags drop just yours.
  406.         // FIX maybe drop just opponents.  not sure.
  407.         if (both){
  408.             DropFlag(FLAG_1);
  409.             DropFlag(FLAG_2);
  410.         } else {
  411.             flag_color=self.team;
  412.             DropFlag(flag_color);
  413.         }
  414.     } else if (flag_color > 0){
  415.         DropFlag(flag_color);
  416.     } 
  417.     if (flag_color & self.team) self.flagtime=0;
  418. };
  419.  
  420. void() W_PlaceFlag =
  421. {
  422.     if (world_flag == 0)
  423.     {
  424.         bprint("Both Flags already placed.\n");
  425.         return;
  426.     }
  427.     if (self.team == 1) 
  428.     {
  429.         if (world_flag & FLAG_1)
  430.         {
  431.             bprint("Silver Flag Placed by ");
  432.             bprint(self.netname);
  433.             bprint("\n");
  434.             PlaceBase(FLAG_1);
  435.             ReturnFlagToBase(self,FLAG_1);
  436.             return;
  437.         }
  438.         else
  439.         {
  440.             centerprint(self,"Silver flag already dropped\n");
  441.             return;
  442.         }
  443.     }
  444.     if (self.team == 2)
  445.     {
  446.         if (world_flag & FLAG_2)
  447.         {
  448.             bprint("Gold Flag Placed by ");
  449.             bprint(self.netname);
  450.             bprint("\n");
  451.             PlaceBase(FLAG_2);
  452.             ReturnFlagToBase(self,FLAG_2);
  453.             return;
  454.         }
  455.         else
  456.         {           
  457.             centerprint(self,"Gold flag already dropped\n");
  458.             return;
  459.         }
  460.     }
  461.     if (self.team > 2)
  462.     {
  463.         centerprint(self,"You must be on Silver or Gold team\n");
  464.         centerprint(self,"Type COLOR x 0 or COLOR x 1\n");
  465.         return;
  466.     }
  467. };
  468.  
  469. void (entity targ, entity attacker, float makeit) CheckTeamRules= {
  470.  
  471.     local entity temp_ent,head;
  472.     local float dist;
  473.  
  474.     if ((teamplay == 7) && targ.flaginv) {
  475.         bprint(targ.netname);
  476.         bprint(" died carrying ");
  477.         if (targ.flaginv == FLAG_BOTH) 
  478.             bprint("Both flags.\n");
  479.         else if (targ.flaginv == FLAG_1) 
  480.             bprint("Silver flag.\n");
  481.         else if (targ.flaginv == FLAG_2)
  482.             bprint("Gold flag.\n");
  483.         temp_ent = self;
  484.         self = targ;
  485.         DropFlagCheck(TRUE);
  486.         self = temp_ent;
  487.     }
  488.  
  489. // make closest player TI upon death
  490. if ((attacker.classname != "player") || (attacker == targ)){
  491.     if(((teamplay!=5) && (teamplay!=6)) && (!makeit)) return;
  492.     dist=100;
  493.     while(!head && (dist < 4000)){
  494.         head=findradius(targ.origin,dist);
  495.         while(head){
  496.             if((head.classname=="player")&&(head!=targ)&&(dist<4000)){
  497.                 MakeNotIt(targ);
  498.                 MakeIt(head);
  499.                 dist=4000;
  500.             } 
  501.             head=head.chain;
  502.         }    
  503.         dist=dist+100;
  504.     }
  505.     return;
  506. // only non its can frag
  507. if(teamplay == 4) {
  508.     if (attacker.flags & FL_AM_IT) {
  509.         MakeIt(targ);
  510.         MakeNotIt(attacker);
  511.         attacker.frags=attacker.frags - 1;
  512.     } else {
  513.         if (targ.flags & FL_AM_IT)
  514.         attacker.frags = attacker.frags + 2;
  515.         }
  516.     }
  517.  
  518. //ti gets 3 frags for killing 
  519. if(teamplay == 5) {
  520.     if (!(attacker.flags & FL_AM_IT)) {
  521.         if (targ.flags & FL_AM_IT) {
  522.             MakeIt(attacker);
  523.             MakeNotIt(targ);
  524.         }
  525.     } else {
  526.         // give three frags if kill he killed a non-ti
  527.         if (!(targ.flags & FL_AM_IT)) {
  528.             attacker.frags = attacker.frags + 2;
  529.         } else {
  530.             MakeIt(attacker);
  531.             MakeNotIt(targ);
  532.         }
  533.     }
  534. }
  535.  
  536. if(teamplay == 6) {
  537.     if (!(attacker.flags & FL_AM_IT)) {
  538.         if (targ.flags & FL_AM_IT) {
  539.             MakeIt(attacker);
  540.             MakeNotIt(targ);
  541.             attacker.frags = attacker.frags + 2;
  542.         }
  543.     } else if (targ.flags & FL_AM_IT) {
  544.             MakeIt(attacker);
  545.             MakeNotIt(targ);
  546.         }
  547.     }
  548. };
  549.  
  550. void() CheckTeamPlay = {
  551.     local float found_it;
  552.     local entity head;
  553.     if (teamplay > 3 && teamplay < 9) {
  554.         if (teamplay == 7) {
  555.             if (((world_flag == 0) && (self.flaginv & FLAG_1)) || 
  556.             ((world_flag & FLAG_1) && (self.team == FLAG_1))) {
  557.                 self.items = self.items | IT_KEY1;
  558.                 self.flaginv = self.flaginv | FLAG_1;
  559.                 self.effects = self.effects | EF_DIMLIGHT;
  560.             } else self.items = self.items - (self.items & IT_KEY1);
  561.             if (((world_flag == 0) && (self.flaginv & FLAG_2)) || 
  562.             ((world_flag & FLAG_2) && (self.team == FLAG_2))) {
  563.                 self.items = self.items | IT_KEY2;
  564.                 self.flaginv = self.flaginv | FLAG_2;
  565.                 self.effects = self.effects | EF_DIMLIGHT;
  566.             } else self.items = self.items - (self.items & IT_KEY2);
  567.             if ((self.flagtime < time) && self.flagtime) {
  568.                 bprint(self.netname);
  569.                 bprint("'s flag returned to his base\n");
  570.                 ReturnFlagToBase(self,self.team);    
  571.             }
  572.         } 
  573.         if (checktime > time) return;
  574.         if((teamplay >3) && (teamplay < 7)){
  575.             head=find(world,classname,"player");
  576.             while(head){
  577.                 if (head.flags & FL_AM_IT) {
  578.                     found_it=TRUE;
  579.                     MakeIt(head);
  580.                 } else {
  581.                     MakeNotIt(head);
  582.                 }
  583.                 head=find(head,classname,"player");
  584.             }
  585.             if (!found_it) {
  586.                 MakeIt(self);
  587.             }
  588.         }
  589.     }
  590.     checktime=time + 5;
  591. };
  592.